home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / pcfig4th.zip / 4TH-DISK.ASM next >
Assembly Source File  |  1983-07-30  |  4KB  |  173 lines

  1. SUBTTL Disk interface code
  2. PAGE
  3.  
  4.  
  5. ;FIG-FORTH disk interface: no file access
  6.  
  7. ;This is SYSTEM-DEPENDENT code, and is normally INCLUDED by
  8. ;4TH-SYSD.ASM
  9.  
  10. ; Disk parameters are set in the 4TH-OPT.H file.
  11.  
  12. IF    INCH EQ 8
  13. TRKS        EQU    77        ;Tracks on 8" disk
  14. RPT        EQU    26*DENSITY    ;8" sec/track
  15.  
  16. IF    DENSITY-2
  17. RECSIZE        EQU    128        ;Bytes/sector, SD
  18. ELSE
  19. RECSIZE        EQU    1024        ;Bytes/sector, DD
  20. ENDIF
  21.  
  22. ELSE
  23.  
  24. TRKS        EQU    40        ;tracks on a 5" disk
  25. RPT        EQU    8        ;sectors/track
  26. RECSIZE        EQU    512        ;bytes/sector, dd only
  27.  
  28. ENDIF
  29.  
  30. RPBLOCK        EQU    BUFSIZE/RECSIZE        ;disk records/1K block
  31. RPDRIVE        EQU    TRKS*RPT*SIDES        ;records/drive
  32. WASTE        EQU    RPDRIVE MOD RPBLOCK    ;rec's. left over
  33. BLPDRIVE    EQU    (RPDRIVE-WASTE)/RPBLOCK    ;whole blocks/drive
  34.  
  35. ;=#+  REC/BLK    number of disk records to fill 1 buffer    -- n
  36.  
  37.         $CONST    87H,REC/BL,K,RPBLK    ;Disk records per 1K
  38.         DW    RPBLOCK
  39.  
  40. ;=#+  BLK/DRIVE    number of 1K blocks per drive        -- n
  41.  
  42.         $CONST    89H,BLK/DRIV,E,BLPDRV    ;1K blocks per drive
  43.         DW    BLPDRIVE
  44.  
  45. ;=#+  MAXDRIVE    highest valid drive number        -- n
  46.  
  47.         $CONST    88H,MAXDRIV,E,MXDRV    ;highest legal drive #
  48.         DW    DRIVES-1
  49.  
  50. ;=#+  MAXBLOCK    highest valid block number        -- n
  51.  
  52.         $CONST    88H,MAXBLOC,K,MXBLK    ;highest legal block #
  53.         DW    BLPDRIVE*DRIVES-1
  54.  
  55. ;=:   DR0    set offset for drive zero        --
  56.  
  57.         $COLON    83H,DR,0,DRZER
  58.         DW    ZERO,    OFSET,    STORE
  59.         DW    SEMIS
  60.  
  61. ;=:   DR1    set offset for drive one        --
  62.  
  63.         $COLON    83H,DR,1,DRONE
  64.         DW    BLPDRV
  65.         DW    OFSET,    STORE,    SEMIS
  66.  
  67. ;=:+  D&RCALC    set drive/record for block n        n --
  68.  
  69.         $COLON    87H,D&RCAL,C,DRCAL
  70.         DW    DUPP,    ZLESS
  71.         DW    OVER,    MXBLK,    GREAT,    ORR
  72.         DW    LIT,    6,    QERR    ;range error!
  73.         DW    BLPDRV,    SLMOD
  74.         DW    DRIVE,    STORE
  75.         DW    RPBLK,    STAR
  76.         DW    REC,    STORE,    SEMIS
  77.  
  78. ;=:+  BLKRD    read one block from disk to addr    addr blk --
  79.  
  80.         $COLON    85H,BLKR,D,BLKRD
  81.         DW    DRCAL        ;set DRIVE and RECORD
  82.         DW    DTA,    STORE    ;set DTA
  83.         DW    PBLKRD,    SEMIS    ;read it
  84.  
  85. ;=:+  BLKWRT    write one block to disk from addr    addr blk --
  86.  
  87.         $COLON    86H,BLKWR,T,BLKWRT
  88.         DW    DRCAL        ;set DRIVE and RECORD
  89.         DW    DTA,    STORE    ;set DTA
  90.         DW    PBLKWRT,    SEMIS    ;write it
  91.  
  92. ;=C+  (BLKRD)    block read primitive            --
  93.  
  94. TRIED        DW    ?        ;retry flag
  95.  
  96.         $CODE    87H,(BLKRD,),PBLKRD
  97.         PUSH    SI
  98.         PUSH    BP
  99.         MOV    [TRIED],0    ;reset retry flag
  100. RETRY:        MOV    2[DSKERR],0    ;reset error flag
  101.         MOV    AX,2[DRIVE]    ;AL = drive no.
  102.         MOV    BX,2[DTA]    ;BX = transfer address
  103.         MOV    CX,2[RPBLK]    ;CX = no. records to transfer
  104.         MOV    DX,2[REC]    ;DX = logical record #
  105.         INT    37        ;BIOS disk read function
  106.         JNC    READXIT        ;carry set if error
  107.  
  108.         CALL    DCHECK        ;force media check
  109.         OR    AX,AX        ;0 if hopeless
  110.         JNZ    RETRY        ;may be ok...
  111.  
  112. READXIT:    POPF
  113.         POP    BP
  114.         POP    SI
  115.         JMP    NEXT
  116.  
  117. ;=C+  (BLKWRT)    block write primitive            --
  118.  
  119.         $CODE    88H,(BLKWRT,),PBLKWRT
  120.         PUSH    SI
  121.         PUSH    BP
  122.         MOV    [TRIED],0    ;reset retry flag
  123. WRETRY:        MOV    2[DSKERR],0    ;reset error flag
  124.         MOV    AX,2[DRIVE]
  125.         MOV    BX,2[DTA]
  126.         MOV    CX,2[RPBLK]
  127.         MOV    DX,2[REC]
  128.         INT    38        ;BIOS disk write function
  129.         JNC    WRTXIT
  130.  
  131.         XOR    AH,AH        ;return negative error code
  132.         NEG    AX
  133.         MOV    2[DSKERR],AX    ;AL has error code
  134.         MOV    BYTE PTR 2[DSKERR],AL    ;AL has error code
  135.         CALL    DCHECK        ;force media check
  136.         OR    AX,AX        ;0 if hopeless
  137.         JNZ    WRETRY        ;may be ok...
  138.  
  139. WRTXIT:        POPF
  140.         POP    BP
  141.         POP    SI
  142.         JMP    NEXT
  143.  
  144. ;This subroutine was added because the disk read/write interrupts
  145. ;under MS-DOS >2.0 don't handle different density disks.
  146. ;If the DOS version is 2.0 or greater, this function forces MS-DOS
  147. ;to check the disk format and returns AX=TRUE.
  148. ;If the version is less than 2.0, or DCHECK has already tried once,
  149. ;AX has 0 on exit.
  150.  
  151. DCHECK        PROC    NEAR
  152.  
  153.         MOV    AX,[TRIED]
  154.         XOR    AX,AX
  155.         JNZ    NOHOPE        ;already tried once...
  156.  
  157.         MOV    [TRIED],TRUE    ;set flag
  158.         MOV    AH,30H
  159.         INT    21H        ;get DOS version
  160.         CMP    AL,2        ;less than 2.0?
  161.         JL    NOHOPE        ;must be hard error
  162.  
  163.         MOV    DX,2[DRIVE]
  164.         INC    DX        ;0=default, 1=A, 2=B!
  165.         MOV    AH,36H        ;force media check by calling
  166.         INT    21H        ;disk free space function
  167.         MOV    AX,TRUE        ;still hope, try again
  168.         RET    2        ;flags from first try
  169. NOHOPE:
  170.         MOV    AX,0
  171.         RET
  172. DCHECK        ENDP
  173.